package com.day12_Thread.ExcutorServiceDemo;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName: ExcutorServiceDemo
 * @Author: zw
 * @Description: 出百万拳，行万里路；
 * @Create 2025/4/6-10:20
 * @Version 1.0
 */
public class ExcutorServiceDemo {
    // 创建线程池方式1 使用ExcutorService的实现类ThreadPoolExecutor 创建一个线程池对象
    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 5, 5, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
        // 1. 处理ruunable 任务
        Runnable myRunnable = new MyRunnable(); // 多态
        threadPoolExecutor.execute(myRunnable); // 执行任务 1， 首次会创建线程， 自动启动线程处理任务
        threadPoolExecutor.execute(myRunnable); // 执行任务 2  第二次就不一定会创建线程了。
        threadPoolExecutor.execute(myRunnable); // 执行任务 3
        threadPoolExecutor.execute(myRunnable); // 核心线程就3个，多的任务会进行复用
        threadPoolExecutor.execute(myRunnable); // 核心线程就3个，多的任务会进行复用
        threadPoolExecutor.execute(myRunnable); // 核心线程就3个，多的任务会进行复用
        // 此时3任务队列都满了，
        // 在创建就会到了启动临时线程的时机 5-3 = 2 ； 有2个临时线程
        threadPoolExecutor.execute(myRunnable); // 到了临时线程时间了
        threadPoolExecutor.execute(myRunnable); // 到了临时线程时间了
        // 模拟中 此时3个核心线程在忙， 3个任务队列满了， 临时线程也在忙，此时在创建任务就到了拒绝策略了
        threadPoolExecutor.execute(myRunnable); // 拒绝策略。
        // g关闭线程池 一般不会关闭
//        threadPoolExecutor.shutdown(); // 这个等所有任务执行完成后才关闭线程池
//        threadPoolExecutor.shutdownNow(); // 这个是立刻关闭
    }
}
class MyRunnable implements Runnable {
    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        for (int i = 0; i < 5; i++) {

            System.out.println(name + "：子线程输出" + i);
            try {
                Thread.sleep(Integer.MAX_VALUE);  // 模拟线程一直在处理，一直在忙
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}
